package br.com.gbvbahia.mybooks.dao;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import br.com.gbvbahia.mybooks.modelos.LivroPrateleiraVO;

/**
 * Por ser uma classe de relacionamento entre duas entidades n�o utilizei a
 * heran�a, se esse tipo de situa��o aumentar irei definir um padr�o de
 * comportamento em heran�a.
 * 
 * @author Guilherme
 * 
 */
public class LivroPrateleiraDAO {
	public static final String LIVRO_PRATELEIRA_TABLE_NAME = "livro_prateleira";
	public static final String[] columns = { "cd_livro", "cd_prateleira",
			"sincronizado" };

	public LivroPrateleiraDAO() {
		super();
	}

	public LivroPrateleiraVO buscarPorIdLivroIdPrateleira(String idLivro,
			String idPrateleira, SQLiteDatabase db) {
		Cursor cursor = null;
		try {
			cursor = db.query(true, LIVRO_PRATELEIRA_TABLE_NAME, new String[] {
					columns[0], columns[1] }, columns[0] + "=? AND "
					+ columns[1] + "=?", new String[] { idLivro.toString(),
					idPrateleira.toString() }, null, null, columns[0], null);
			if (cursor.moveToNext()) {
				return getFromCursor(cursor);
			}
			return null;
		} finally {
			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
		}
	}

	/**
	 * Devolve os IDs das prateleiras que estao em uma que contém um determinado
	 * livro.
	 * 
	 * @return
	 */
	public List<String> buscarIdPrateleiras(String idlivro, SQLiteDatabase db) {
		List<String> toReturn = new ArrayList<String>();
		Cursor cursor = null;
		try {
			cursor = db.query(true, LIVRO_PRATELEIRA_TABLE_NAME,
					new String[] { columns[1] }, columns[0] + "=?",
					new String[] { idlivro.toString() }, null, null,
					columns[1], null);
			while (cursor.moveToNext()) {
				toReturn.add(cursor.getString(0));
			}
			return toReturn;
		} finally {
			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
		}
	}

	/**
	 * Devolve os IDs dos livros que est�o em uma determinada prateleira
	 * 
	 * @return
	 */
	public List<String> buscarIdLivros(String idPrateleira, SQLiteDatabase db) {
		List<String> toReturn = new ArrayList<String>();
		Cursor cursor = null;
		try {
			cursor = db.query(true, LIVRO_PRATELEIRA_TABLE_NAME,
					new String[] { columns[0] }, columns[1] + "=?",
					new String[] { idPrateleira.toString() }, null, null,
					columns[0], null);
			while (cursor.moveToNext()) {
				toReturn.add(cursor.getString(0));
			}
			return toReturn;
		} finally {
			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
		}
	}

	/**
	 * Apaga o relacionamento de uma prateleira com um livro
	 * 
	 * @param vo
	 * @return
	 */
	public long delete(LivroPrateleiraVO vo, SQLiteDatabase db) {
		return db.delete(LIVRO_PRATELEIRA_TABLE_NAME, columns[0] + "=? AND "
				+ columns[1] + "=?", new String[] { vo.getCdLivro().toString(),
				vo.getCdPrateleira().toString() });
	}

	/**
	 * Apaga um relacionamento de um livro com todas as prateleiras que o
	 * possui. Deve ser executado antes de apagar um livro.
	 * 
	 * @param idLivro
	 * @return
	 */
	public long deleteLivro(String idLivro, SQLiteDatabase db) {
		return db.delete(LIVRO_PRATELEIRA_TABLE_NAME, columns[0] + "=?",
				new String[] { idLivro.toString() });
	}

	/**
	 * Apaga o relacionamento de uma prateleira com todos os livros que a
	 * possuem. Deve ser executado antes de apagar uma prateleira.
	 * 
	 * @param idPrateleira
	 * @return
	 */
	public long deletePrateleira(String idPrateleira, SQLiteDatabase db) {
		return db.delete(LIVRO_PRATELEIRA_TABLE_NAME, columns[1] + "=?",
				new String[] { idPrateleira.toString() });
	}

	/**
	 * Cria um relacionamento de um livro com uma prateleira.
	 * 
	 * @param vo
	 * @return
	 */
	public long insert(LivroPrateleiraVO vo, SQLiteDatabase db) {
		ContentValues cv = new ContentValues();
		populateContentValues(vo, cv);
		return db.insert(LIVRO_PRATELEIRA_TABLE_NAME, null, cv);
	}

	/**
	 * Atualiza se o relacionamento est� sincronizado na nuvem, webservice...
	 * 
	 * @param cdLivro
	 * @param cdPrateleira
	 * @param sincronizado
	 * @return
	 */
	public long update(String cdLivro, String cdPrateleira, int sincronizado,
			SQLiteDatabase db) {
			ContentValues cv = new ContentValues();
			populateContentValues(new LivroPrateleiraVO(cdLivro, cdPrateleira,
					sincronizado), cv);
			return db
					.update(LIVRO_PRATELEIRA_TABLE_NAME, cv, columns[0]
							+ "=? AND " + columns[1] + "=?", new String[] {
							cdLivro.toString(), cdPrateleira.toString() });
	}

	private void populateContentValues(LivroPrateleiraVO vo, ContentValues cv) {
		cv.put(columns[0], vo.getCdLivro());
		cv.put(columns[1], vo.getCdPrateleira());
		cv.put(columns[2], vo.getSincronizado());
	}

	private LivroPrateleiraVO getFromCursor(Cursor cursor) {
		LivroPrateleiraVO toReturn = new LivroPrateleiraVO();
		toReturn.setCdLivro(cursor.getString(cursor.getColumnIndex(columns[0])));
		toReturn.setCdPrateleira(cursor.getString(cursor
				.getColumnIndex(columns[1])));
		toReturn.setSincronizado(cursor.getInt(cursor
				.getColumnIndex(columns[2])));
		return toReturn;
	}
}
